#define __QYQ_ARITHMETIC_TIME_C_
#include "qyq_arithmetic_time.h"

//#define qyq_arithmetic_time_leapyear(y) ((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0))

uint8_t qyq_arithmetic_time_leapyear(int32_t year)
{
    return ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0));
}

uint8_t qyq_arithmetic_time_week(int32_t year, int32_t month, int32_t day)
{
    int32_t weektxt;       // 星期变量
    int32_t virt_yeartxt;  // 创建一个虚拟适用于基姆拉尔森算式的年变量
    int32_t virt_monthtxt; // 创建一个虚拟适用于基姆拉尔森算式的月变量
    virt_yeartxt = year;   // 赋予给 虚拟年
    virt_monthtxt = month; // 赋予给 虚拟月
    // 把一月和二月看成是上一年的十三月和十四月， 例： 如果是 2004-1-10 则换算成： 2003-13-10 来代入公式计算。
    if ((1 == month) || (2 == month))
    {
        virt_monthtxt += 12; // 产生 13/14
        virt_yeartxt -= 1;   // 赋予给 虚拟年
    }
    // 基姆拉尔森算式 此公式是 0~6 表示星期一至星期日
    weektxt = (day + 2 * virt_monthtxt + 3 * (virt_monthtxt + 1) / 5 + virt_yeartxt + virt_yeartxt / 4 - virt_yeartxt / 100 + virt_yeartxt / 400) % 7;
    weektxt += 1; // 转换为 1~7 表示星期一至星期日
    return weektxt;
}

uint16_t qyq_arithmetic_time_yearday(int32_t year, int32_t month, int32_t day)
{
    int32_t num = 0;
    switch (month - 1)
    {
    case 1:
    {
        num = 31;
        break;
    }
    case 2:
    {
        num = 28 + 31;
        break;
    }
    case 3:
    {
        num = 31 + 28 + 31;
        break;
    }
    case 4:
    {
        num = 30 + 31 + 28 + 31;
        break;
    }
    case 5:
    {
        num = 31 + 30 + 31 + 28 + 31;
        break;
    }
    case 6:
    {
        num = 30 + 31 + 30 + 31 + 28 + 31;
        break;
    }
    case 7:
    {
        num = 31 + 30 + 31 + 30 + 31 + 28 + 31;
        break;
    }
    case 8:
    {
        num = 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31;
        break;
    }
    case 9:
    {
        num = 30 + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31;
        break;
    }
    case 10:
    {
        num = 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31;
        break;
    }
    case 11:
    {
        num = 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 28 + 31;
        break;
    }
    default:
        break;
    }
    if (qyq_arithmetic_time_leapyear(year) && (month > 2))
    {
        num++;
    }
    num += day;

    return num;
}